package com.zhsource.system.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zhsource.system.domain.Menu;
import com.zhsource.system.mapper.MenuMapper;
import com.zhsource.system.query.MenuQuery;
import com.zhsource.system.service.IMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * <p>@ClassName：MenuServiceImpl
 * <p>@Date 2023/10/17  13:01
 *
 * @Author zzl
 **/
@Service
public class MenuServiceImpl implements IMenuService {

    @Autowired
    private MenuMapper menuMapper;

    @Override
    public List<Menu> list() {
        return menuMapper.list();
    }

    @Override
    public Menu selectById(Long id) {
        return menuMapper.selectById(id);
    }

    //    @Override
//    public PageResult<List<Menu>> page(MenuQuery menuQuery) {
////        // 1.查询总条数
//        Integer total = menuMapper.total(menuQuery);
//        // 2.查询当前页数据
//        List<Menu> page = menuMapper.page(menuQuery);
//
//        return  new PageResult<>(total,page);
//
//    }
    @Override
    public PageInfo<Menu> page(MenuQuery menuQuery) {
        // 1.下面这句代码表示开启分页，会将紧挨着这句代码的下一次数据库执行进行分页，切记一定要放在要分页的SQL语句前面执行
        PageHelper.startPage(menuQuery.getCurrentPage(), menuQuery.getPageSize());

        // 2.执行SQL语句带条件查询，SQL语句不需要进行分页
        List<Menu> page = menuMapper.page(menuQuery);
        // 3.将查询结果转换为PageInfo对象，PageInfo对象中有前端分页所需要的各种参数
        PageInfo<Menu> pageInfo = new PageInfo<>(page);
        // 4.响应总条数和分页信息
        return pageInfo;

    }

    @Override
    public void update(Menu menu) {
        menuMapper.update(menu);
    }

    @Override
    public void insert(Menu menu) {
        menuMapper.insert(menu);
    }

    @Override
    public void delete(Long id) {
        menuMapper.delete(id);
    }

    @Override
    public void batchDel(List<Long> ids) {
        menuMapper.batchDel(ids);
    }

    @Override
    public List<Menu> tree() {
        // 1.查询所有菜单数据
        List<Menu> menus = menuMapper.list();
        // 2.准备一个空集合，放组装完成的树数据
        List<Menu> menuTree = new ArrayList<>();

        // 3.遍历集合，找一级以及子级进行组装
        for (Menu menu : menus) {
            // 3.1.如果parentId等于空，那么说明是顶级，就存入到新集合中
            if (menu.getParentId() == null){
                menuTree.add(menu); // 注意：此处是地址值对象存储，不是深拷贝是浅拷贝
            }else { // 3.2.如果它不是顶级，那么一定有父亲
                // 1.再次遍历集合，去找当前外层循环这个对象的父级
                for (Menu parent : menus) {
                    // 2.如果自己的parentId等于父级的Id，那么说明本次循环的这个对象就是外层对象的父亲
                    if (menu.getParentId() == parent.getId()){
                        // 3.把自己放入到父亲的集合字段中
                        parent.getChildren().add(menu);
                    }
                }
            }
        }
        return menuTree;
    }

//    @Override
//    public List<Menu> tree() {
//        // 创建一个新的集合用于存储组装好的数据
//        List<Menu> menuTree = new ArrayList<>();
//
//        List<Menu> menus = menuMapper.list();
//
//        for (Menu menu : menus) {
//            if (menu.getParentId() ==null ){
//                menuTree.add(menu);
//            }else {
//                for (Menu parent : menus) {
//                    if (menu.getParentId()== parent.getId()){
//                        parent.getChildren().add(menu);
//                    }
//                }
//            }
//        }
//        return menuTree;
//    }

}
